/*
 * Transmissão de Dados - Trabalho 3
 *
 * Alex Rodrigo de Oliveira      - 06/30403
 * Danilo Gaby Andersen Trindade - 06/82039
 */

#include <stdbool.h>
#include <stdint.h>
#include "checksum.h"
#include "segments.h"

#define MOD_ADLER 65521


static uint32_t adler32(uint8_t *data, int len) {
	uint32_t a = 1, b = 0;
	while (len--) {
		a = (a + *data++) % MOD_ADLER;
		b = (b + a) % MOD_ADLER;
	}
	return (b << 16) | a;
}


/*
 * Retorna o inverso da soma do segmento para ser comparado no destinatário.
 */
uint32_t calc_checksum(void *segment, int size) {
	return adler32(segment + 4, size - 4);
}


// TODO: corrigir essa função
bool verify_checksum(void *segment, int size) {
	return (adler32(segment + 4, size - 4)) ? true : false;
}
